package entities;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import dtos.ItemVentaDTO;
import dtos.VentaDTO;

@Entity
@Table(name = "Ventas")
public class Venta implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private int nroVenta;
	@Column
	private String fechaVenta;
	@Column
	private String idModulo;
	@Column
	private double coordenadaX;
	@Column
	private double coordenadaY;
	
	@Column
	private double montoTotal;
	
	@OneToMany(mappedBy = "idArticuloVenta.venta", fetch = FetchType.EAGER, cascade = {CascadeType.ALL} )
	private List<ItemVenta> itemsVenta;
	
	@OneToOne
	private Usuario usuario;
	
	@Column
	private String estadoEntrega;
	
	
    /**
     * Default constructor. 
     */
    public Venta() {
    	itemsVenta = new ArrayList<ItemVenta>();
    	this.montoTotal = 0;
    }

    /**
	 * @return the codigo
	 */
	public int getNroVenta() {
		return nroVenta;
	}

	/**
	 * @param codigo the codigo to set
	 */
	public void setNroVenta(int nroVenta) {
		this.nroVenta = nroVenta;
	}

	/**
	 * @return the fechaVenta
	 */
	public String getFechaVenta() {
		return fechaVenta;
	}

	/**
	 * @param fechaVenta the fechaVenta to set
	 */
	public void setFechaVenta(String fechaVenta) {
		this.fechaVenta = fechaVenta;
	}

	public double getMontoTotal() {
		return montoTotal;
	}

	public void setMontoTotal(double montoTotal) {
		this.montoTotal = montoTotal;
	}

	public List<ItemVenta> getItemsVenta() {
		return itemsVenta;
	}

	public void setItemsVenta(List<ItemVenta> itemsVenta) {
		this.itemsVenta = itemsVenta;
	}
	
	public void addItemVenta(ItemVenta itemVenta){
		itemVenta.setVenta(this);
		this.itemsVenta.add(itemVenta);
		if(this.montoTotal!=0)
			this.montoTotal+= itemVenta.getSubtotal();
		else
			this.montoTotal= itemVenta.getSubtotal();
	}
	
	public String getIdModulo() {
		return idModulo;
	}

	public void setIdModulo(String idModulo) {
		this.idModulo = idModulo;
	}

	public double getCoordenadaX() {
		return coordenadaX;
	}

	public void setCoordenadaX(double coordenadaX) {
		this.coordenadaX = coordenadaX;
	}

	public double getCoordenadaY() {
		return coordenadaY;
	}

	public void setCoordenadaY(double coordenadaY) {
		this.coordenadaY = coordenadaY;
	}

	private List<ItemVentaDTO> instanciaItemVtaDTO(){
		List<ItemVentaDTO> listaItemVentaDTO = new ArrayList<ItemVentaDTO>();
		for (ItemVenta itemVta : itemsVenta) {
			ItemVentaDTO itmVtaDTO = new ItemVentaDTO();
			itmVtaDTO = generarItemDTO(itemVta);
			listaItemVentaDTO.add(itmVtaDTO);
		}
		return listaItemVentaDTO;
	}
	
	private ItemVentaDTO generarItemDTO(ItemVenta itmVta){
		ItemVentaDTO itmVtaDTO = new ItemVentaDTO();
		itmVtaDTO.setCantidad(itmVta.getCantidad());
		itmVtaDTO.setCodigoArticulo(itmVta.getId().getArticulo().getCodigo());
		itmVtaDTO.setCodigoVenta(itmVta.getId().getVenta().getNroVenta());
		
		return itmVtaDTO;
	} 
	
	public VentaDTO instanciaDTO(){
		VentaDTO vtaDTO = new VentaDTO();
		vtaDTO.setFecha(this.fechaVenta);
		vtaDTO.setIdModulo(this.idModulo);
		vtaDTO.setCoordenadaX(this.coordenadaX);
		vtaDTO.setCoordenadaY(this.coordenadaY);
		vtaDTO.setNroVenta(this.nroVenta);
		vtaDTO.setItemsVenta(instanciaItemVtaDTO());
		vtaDTO.setMontoTotal(this.montoTotal);
		vtaDTO.setEstadoEntrega(this.estadoEntrega);
		return vtaDTO;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public String getEstadoEntrega() {
		return estadoEntrega;
	}

	public void setEstadoEntrega(String estadoEntrega) {
		this.estadoEntrega = estadoEntrega;
	}
	
	
	
}
